#!/bin/bash

# WebSocket服务器构建脚本
# 作者: 毕业论文项目
# 版本: 1.0

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示帮助信息
show_help() {
    echo "WebSocket服务器构建脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help          显示此帮助信息"
    echo "  -c, --clean         清理构建目录"
    echo "  -d, --debug         调试模式构建"
    echo "  -r, --release       发布模式构建"
    echo "  -t, --test          构建并运行测试"
    echo "  -i, --install      安装到系统"
    echo ""
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查CMake
    if ! command -v cmake &> /dev/null; then
        log_error "CMake未安装，请先安装CMake"
        exit 1
    fi
    
    # 检查GCC
    if ! command -v gcc &> /dev/null; then
        log_error "GCC未安装，请先安装GCC"
        exit 1
    fi
    
    # 检查Make
    if ! command -v make &> /dev/null; then
        log_error "Make未安装，请先安装Make"
        exit 1
    fi
    
    log_success "依赖检查通过"
}

# 清理构建目录
clean_build() {
    log_info "清理构建目录..."
    if [ -d "build" ]; then
        rm -rf build
        log_success "构建目录已清理"
    else
        log_warning "构建目录不存在，跳过清理"
    fi
}

# 配置构建
configure_build() {
    local build_type=$1
    log_info "配置${build_type}构建..."
    
    mkdir -p build
    cd build
    
    if [ "$build_type" = "Debug" ]; then
        cmake -DCMAKE_BUILD_TYPE=Debug ..
    else
        cmake -DCMAKE_BUILD_TYPE=Release ..
    fi
    
    cd ..
    log_success "构建配置完成"
}

# 编译项目
compile_project() {
    log_info "开始编译项目..."
    cd build
    make -j$(nproc)
    cd ..
    log_success "项目编译完成"
}

# 运行测试
run_tests() {
    log_info "运行测试..."
    cd build
    
    if [ -f "websocket_tests" ]; then
        ./websocket_tests
        if [ $? -eq 0 ]; then
            log_success "所有测试通过"
        else
            log_error "测试失败"
            exit 1
        fi
    else
        log_error "测试程序未找到，请先构建项目"
        exit 1
    fi
    
    cd ..
}

# 显示构建结果
show_build_result() {
    log_info "构建结果:"
    echo ""
    
    if [ -f "build/websocket_server" ]; then
        echo -e "  ${GREEN}✓${NC} 服务器程序: build/websocket_server"
        ls -la build/websocket_server | awk '{print "    大小:", $5, "字节"}'
    else
        echo -e "  ${RED}✗${NC} 服务器程序: 未找到"
    fi
    
    if [ -f "build/websocket_client" ]; then
        echo -e "  ${GREEN}✓${NC} 客户端程序: build/websocket_client"
        ls -la build/websocket_client | awk '{print "    大小:", $5, "字节"}'
    else
        echo -e "  ${RED}✗${NC} 客户端程序: 未找到"
    fi
    
    if [ -f "build/websocket_tests" ]; then
        echo -e "  ${GREEN}✓${NC} 测试程序: build/websocket_tests"
    else
        echo -e "  ${RED}✗${NC} 测试程序: 未找到"
    fi
    
    echo ""
}

# 安装到系统
install_system() {
    log_info "安装到系统..."
    
    if [ ! -f "build/websocket_server" ]; then
        log_error "服务器程序未找到，请先构建项目"
        exit 1
    fi
    
    # 创建安装目录
    sudo mkdir -p /opt/websocket-server
    
    # 复制文件
    sudo cp build/websocket_server /opt/websocket-server/
    sudo cp build/websocket_client /opt/websocket-server/
    
    # 设置权限
    sudo chmod +x /opt/websocket-server/websocket_server
    sudo chmod +x /opt/websocket-server/websocket_client
    
    log_success "安装完成"
    echo "服务器程序: /opt/websocket-server/websocket_server"
    echo "客户端程序: /opt/websocket-server/websocket_client"
}

# 主函数
main() {
    local clean=false
    local debug=false
    local release=false
    local test=false
    local install=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -c|--clean)
                clean=true
                shift
                ;;
            -d|--debug)
                debug=true
                shift
                ;;
            -r|--release)
                release=true
                shift
                ;;
            -t|--test)
                test=true
                shift
                ;;
            -i|--install)
                install=true
                shift
                ;;
            *)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 默认构建模式
    if [ "$debug" = false ] && [ "$release" = false ]; then
        release=true
    fi
    
    # 显示欢迎信息
    echo "=========================================="
    echo "    WebSocket服务器构建脚本"
    echo "=========================================="
    echo ""
    
    # 检查依赖
    check_dependencies
    
    # 清理构建目录
    if [ "$clean" = true ]; then
        clean_build
    fi
    
    # 配置构建
    if [ "$debug" = true ]; then
        configure_build "Debug"
    elif [ "$release" = true ]; then
        configure_build "Release"
    fi
    
    # 编译项目
    compile_project
    
    # 运行测试
    if [ "$test" = true ]; then
        run_tests
    fi
    
    # 显示构建结果
    show_build_result
    
    # 安装到系统
    if [ "$install" = true ]; then
        install_system
    fi
    
    # 显示使用说明
    echo "使用说明:"
    echo "  启动服务器: ./build/websocket_server"
    echo "  启动客户端: ./build/websocket_client"
    echo "  运行测试: ./build/websocket_tests"
    echo ""
    
    log_success "构建过程完成!"
}

# 运行主函数
main "$@"